/*
 * jsocket.h
 *
 *  Created on: Dec 2, 2010
 *      Author: fify
 */

#ifndef JSOCKET_H_
#define JSOCKET_H_

#include <string>
#include <vector>

using std::string;
using std::vector;

namespace CncrJConfig
{

class JSocket
{
	const static int BUFSIZE = 409600;
public:
	JSocket()
	{
		m_buf = new char[BUFSIZE];
		m_sock = -1;
		reset();
	}

	JSocket(string host, int port)
	{
		m_buf = new char[BUFSIZE];
		conn_jos(host, port);
		reset();
	}

	virtual ~JSocket()
	{
		delete m_buf;
		close(m_sock);
	}

	// 连接JunOS终端
	int	conn_jos(string host, int port);
	// 向JunOS发送消息（自动补气换行符）
	int send_msg(string msg);

	// Expecting a string in the socket. Return the index if exists and -1 if not.
	int expect(string str);
	int expect(vector<string> &strs);

	// 接收socket中所有返回数据，并清空缓存
	//int recv_and_clear();
#ifdef DEBUG
	// 输出socket中返回的所有数据到标准输出，并清空缓存
	int print_and_clear();
#endif

private:
	//int recv_msg(string &msg);
	// 从socket中读取一行（以\r\n结束的字符串）
	//int read_line(string &result);
	// 从socket中读取一行，并且清空其中的\r\n字符
	//int read_line_pure(string &result);

	// 接收所有的返回数据，并按行存储在result中
	//int recv_all(vector<string>&result);

	/* Incomplete */
	//int recv_all_pure(string &result);

	/*
	 * 不推荐！NOT RECOMMANDED!
	 * 删除socket返回数据中的一行，一般用来清空回显数据，结果不准确！
	 */
	//int truncate_playback();
	// 删除socket缓存中的nbytes字节数据
	void consume(int nbytes);
	// 清空缓存
	void reset();
	/*
	 * 接收在100ms内socket中返回的所有数据.
	 * 注意：此处没有判断缓冲区满的情况，必要时要改变缓冲区大小
	 */
	//int buf_recv();
	//int recv_all(string &result);

	void adjust();

private:
	int m_sock;

	int m_avail;
	char* m_head;
	char* m_buf;
};


} // End of namespace.

#endif /* JSOCKET_H_ */
